package com.java.codeblock;

/**
 * @author Lenl
 * @create 2021-05-30 23:48
 *
 * 类的成员之四：艾玛快
 * 1.代码块作用：初始化类、对象
 * 2.代码块只能使用static修饰或不修饰
 * 3.分类：静态代码块 vs 非静态代码块
 * 4.代码块的执行要先于构造器
 *由父及子，静态先行
 *
 * 4.静态代码块
 *  >内部可以有输出语句
 *  >随者类的加载而执行,而且只执行一次
 *  >作用：初始化类的一些属性
 *  >如果一个类中定义多个静态代码块，则按顺序执行，但比非静态代码块先执行。
 *  >静态代码块内只能调用静态属性与方法
 *
 * 5.非静态代码块
 *  >内部可以有输出语句
 *  >随者对象的创建而执行，每创建一个对象就执行一次非静态代码块
 *  >作用：可以在创建对象时，对对象属性进行初始化
 *  >如果一个类中定义多个非静态代码块，则按顺序执行
 *  >非静态代码块可以调用静和非静态属性、方法
 *
 *  对属性赋值的位置：
 *  ①默认初始化 ②显式初始化 ③代码块中赋值 ③构造器中初始化 ④对象.属性/方法赋值
 *  ⑤代码块中赋值
 *  执行顺序：①-②  / ⑤-③-④
 */
public class CodeBlock {
    public static void main(String[] args) {
        String desc=Person.desc;
        System.out.println(desc);
        Person p=new Person();
    }
}

class Person{
    //属性
    String name;
    int age;
    static  String desc="我是一个人";
    //构造器
    public Person(){

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //代码块
    //静态代码块
    //
    static {
        System.out.println("我是一个静态代码块");
        desc="我是静态代码块初始化的人";
    }
    //非静态代码块
    //
    {
        System.out.println("我是一个非静态代码块");
    }


    //方法
    public void eat(){
        System.out.println("人：吃饭");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}